import { createApp } from './appssr'
export default context => {
  // 因为有可能会是异步路由钩子函数或组件，所以我们将返回一个 Promise，
  // 以便服务器能够等待所有的内容在渲染前，
  // 就已经准备就绪。
  return new Promise((resolve, reject) => {
    const { app, router } = createApp()

    // 设置服务器端 router 的位置
    router.push(context.url)

    // 等到 router 将可能的异步组件和钩子函数解析完
    router.onReady(() => {
      const matchedComponents = router.getMatchedComponents()
      // 匹配不到的路由，执行 reject 函数，并返回 404
      if (!matchedComponents.length) {
        console.log('路由匹配失败')
        console.log(router.currentRoute)
        return reject({ code: 404 })
      }
      // Promise 应该 resolve 应用程序实例，以便它可以渲染
      resolve(app)
      // // 对所有匹配的路由组件调用 `asyncData()`
      // Promise.all(matchedComponents.map(Component => {
      //   console.log('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@')
      //   console.log(Component)
      //   console.log('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@')
      //   if (Component.asyncData) {
      //     return Component.asyncData({
      //       Component,
      //       route: router.currentRoute
      //     })
      //   }
      // })).then(() => {
      //   // 在所有预取钩子(preFetch hook) resolve 后，
      //   // 我们的 store 现在已经填充入渲染应用程序所需的状态。
      //   // 当我们将状态附加到上下文，
      //   // 并且 `template` 选项用于 renderer 时，
      //   // 状态将自动序列化为 `window.__INITIAL_STATE__`，并注入 HTML。
      //   // context.state = store.state
      //
      //   resolve(app)
      // }).catch(reject)
      // // 对所有匹配的路由组件调用 `asyncData()`，获取，处理数据，然后存在 vuex
      // // 供客户端使用
      // Promise.all(matchedComponents.map(({ asyncData }) => asyncData && asyncData({
      //   // store,
      //   abc: this,
      //   route: router.currentRoute
      // }))).then(() => {
      //   // isDev && console.log(`data pre-fetch: ${Date.now() - s}ms`)
      //   // 在所有预取钩子(preFetch hook) resolve 后，
      //   // 我们的 store 现在已经填充入渲染应用程序所需的状态。
      //   // 当我们将状态附加到上下文，
      //   // 并且 `template` 选项用于 renderer 时，
      //   // 状态将自动序列化为 `window.__INITIAL_STATE__`，并注入 HTML。
      //   // context.state = store.state
      //
      //   // Promise 应该 resolve 应用程序实例，以便它可以渲染
      //   resolve(app)
      //
      // }).catch(reject)
    }, reject)
  })
}
